home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
opmset.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
6KB
|
182 lines
.include iocscall.mac
.include global.mac
;----------------------------------------------------------------
opmset .macro src,dst
move.b dst,d1
move.b src,d2
IOCS _OPMSET
.endm
opmall .macro src,dst
move.b src,d3
move.b dst,d4
bsr opm8
.endm
;----------------------------------------------------------------
;FM音源の初期化
.text
.align 4,$2048
init_opm::
movem.l d1-d6,-(sp)
;再生モードに関わらず全チャンネルをKEY OFFしておく
opmset #%0_0_0_0_0_000,#$08 ;C2=0,M2=0,C1=0,M1=0(CH1)
opmset #%0_0_0_0_0_001,#$08 ;C2=0,M2=0,C1=0,M1=0(CH2)
opmset #%0_0_0_0_0_010,#$08 ;C2=0,M2=0,C1=0,M1=0(CH3)
opmset #%0_0_0_0_0_011,#$08 ;C2=0,M2=0,C1=0,M1=0(CH4)
opmset #%0_0_0_0_0_100,#$08 ;C2=0,M2=0,C1=0,M1=0(CH5)
opmset #%0_0_0_0_0_101,#$08 ;C2=0,M2=0,C1=0,M1=0(CH6)
opmset #%0_0_0_0_0_110,#$08 ;C2=0,M2=0,C1=0,M1=0(CH7)
opmset #%0_0_0_0_0_111,#$08 ;C2=0,M2=0,C1=0,M1=0(CH8)
;全レジスタクリア
moveq.l #0,d4
move.w #256-1,d5
@@: opmset #0,d4
addq.b #1,d4
dbra d5,@b
.if WAVE_FORM=0
tst.b mono_play_flag
beq 1f
opmset #%1_1_111_010,#$20 ;(CH1)R=1,L=1,FL=7,CON=2
opmset #%1_1_111_010,#$21 ;(CH2)R=1,L=1,FL=7,CON=2
opmset #%1_1_111_010,#$22 ;(CH3)R=1,L=1,FL=7,CON=2
opmset #%1_1_111_010,#$23 ;(CH4)R=1,L=1,FL=7,CON=2
bra 2f
1: opmset #%0_1_111_010,#$20 ;(CH1)R=0,L=1,FL=7,CON=2
opmset #%0_1_111_010,#$21 ;(CH2)R=0,L=1,FL=7,CON=2
opmset #%0_1_111_010,#$22 ;(CH3)R=0,L=1,FL=7,CON=2
opmset #%0_1_111_010,#$23 ;(CH4)R=0,L=1,FL=7,CON=2
opmset #%1_0_111_010,#$24 ;(CH5)R=1,L=0,FL=7,CON=2
opmset #%1_0_111_010,#$25 ;(CH6)R=1,L=0,FL=7,CON=2
opmset #%1_0_111_010,#$26 ;(CH7)R=1,L=0,FL=7,CON=2
opmset #%1_0_111_010,#$27 ;(CH8)R=1,L=0,FL=7,CON=2
2:
.else ;WAVE_FORM=1,2
tst.b mono_play_flag
beq 1f
opmset #%1_1_000_000,#$20 ;(CH1)R=1,L=1,FL=0,CON=0
opmset #%1_1_000_000,#$21 ;(CH2)R=1,L=1,FL=0,CON=0
opmset #%1_1_000_000,#$22 ;(CH3)R=1,L=1,FL=0,CON=0
opmset #%1_1_000_000,#$23 ;(CH4)R=1,L=1,FL=0,CON=0
bra 2f
1: opmset #%0_1_000_000,#$20 ;(CH1)R=0,L=1,FL=0,CON=0
opmset #%0_1_000_000,#$21 ;(CH2)R=0,L=1,FL=0,CON=0
opmset #%0_1_000_000,#$22 ;(CH3)R=0,L=1,FL=0,CON=0
opmset #%0_1_000_000,#$23 ;(CH4)R=0,L=1,FL=0,CON=0
opmset #%1_0_000_000,#$24 ;(CH5)R=1,L=0,FL=0,CON=0
opmset #%1_0_000_000,#$25 ;(CH6)R=1,L=0,FL=0,CON=0
opmset #%1_0_000_000,#$26 ;(CH7)R=1,L=0,FL=0,CON=0
opmset #%1_0_000_000,#$27 ;(CH8)R=1,L=0,FL=0,CON=0
2:
.endif
opmall #%0_000_0000,#$28 ;OCT=0,NOTE=0
opmall #%000000_00,#$30 ;KF=0
opmall #%0_000_00_00,#$38 ;PMS=0,AMS=0
;DT1=ディチューン1 周波数の微妙なずれ
;MUL=倍率 周波数の倍率 0=0.5倍
;TL=トータルレベル 全体の減衰量→音量を表す 127=最大減衰量(無音)
;AR=アタックレート keyonからアタックまでの増加速度 31=最大速度
;D1R=ファストディケイレート アタックからディケイレベルまでの減衰速度 31=最大速度
;DT2=ディチューン2 周波数の大きなずれ
;D2R=セカンドディケイレート ディケイレベルからkeyoffまでの減衰速度 31=最大速度
;D1L=ディケイレベル D1Rの減衰速度でD1Lの減衰量に達するとD2Rに移行する 15=最大減衰量
;RR=リリースレート keyoff後の減衰 15=最大速度
.if WAVE_FORM=0
opmall #%0_000_0001,#$40 ;(M1)DT1=0,MUL=1
opmall #%0_000_0001,#$50 ;(C1)DT1=0,MUL=1
opmall #%0_000_0001,#$48 ;(M2)DT1=0,MUL=1
opmall #%0_000_0000,#$58 ;(C2)DT1=0,MUL=0
opmall #%0_0101101,#$60 ;(M1)TL=41
opmall #%0_0100100,#$70 ;(C1)TL=60
opmall #%0_0100010,#$68 ;(M2)TL=70
opmall #%0_1111111,#$78 ;(C2)TL=127
.else ;WAVE_FORM=1,2
opmall #%0_000_0001,#$40 ;(M1)DT1=0,MUL=1
opmall #%0_000_0001,#$50 ;(C1)DT1=0,MUL=1
opmall #%0_000_0001,#$48 ;(M2)DT1=0,MUL=1
opmall #%0_000_0000,#$58 ;(C2)DT1=0,MUL=0
.if WAVE_FORM=1
opmall #%0_0101101,#$60 ;(M1)TL=45
opmall #%0_0100100,#$70 ;(C1)TL=36
opmall #%0_0100010,#$68 ;(M2)TL=34
opmall #%0_1111111,#$78 ;(C2)TL=127
.else ;WAVE_FORM=2
opmall #%0_0101111,#$60 ;(M1)TL=47
opmall #%0_0100110,#$70 ;(C1)TL=38
opmall #%0_0100011,#$68 ;(M2)TL=35
opmall #%0_1111111,#$78 ;(C2)TL=127
.endif
.endif
moveq.l #%11_0_00000,d6 ;KS=3
or.b fadein_speed,d6 ;AR=0~31
opmall d6,#$80 ;(M1)KS=3,AR=31
opmall #%0_00_00000,#$A0 ;(M1)AMS=0,D1R=0
opmall #%00_0_00000,#$C0 ;(M1)DT2=0,D2R=0
opmall #%0000_1111,#$E0 ;(M1)D1L=0,RR=15
opmall d6,#$90 ;(C1)KS=3,AR=31
opmall #%0_00_00000,#$B0 ;(C1)AMS=0,D1R=0
opmall #%00_0_00000,#$D0 ;(C1)DT2=0,D2R=0
opmall #%0000_1111,#$F0 ;(C1)D1L=0,RR=15
opmall d6,#$88 ;(M2)KS=3,AR=31
opmall #%0_00_00000,#$A8 ;(M2)AMS=0,D1R=0
opmall #%00_0_00000,#$C8 ;(M2)DT2=0,D2R=0
opmall #%0000_1111,#$E8 ;(M2)D1L=0,RR=15
opmall d6,#$98 ;(C2)KS=3,AR=31
opmall #%0_00_00000,#$B8 ;(C2)AMS=0,D1R=0
opmall #%00_0_00000,#$D8 ;(C2)DT2=0,D2R=0
; C2のD2Rを増やすことでフェードアウトできる
opmall #%0000_1111,#$F8 ;(C2)D1L=0,RR=15
opmset #%00000000,#$18 ;LFRQ=0
opmset #%10000000,#$19 ;PMD=0
opmset #%00000000,#$19 ;AMD=0
opmset #%0_0_0000_01,#$1B ;CT2=0,CT1=0,W=1
movem.l (sp)+,d1-d6
rts
opm8:
moveq.l #4-1,d5
tst.b mono_play_flag
bne @f
moveq.l #8-1,d5
@@:
@@: opmset d3,d4
addq.b #1,d4
dbra d5,@b
rts
;----------------------------------------------------------------
;FM音源の後始末
.text
.align 4,$2048
tini_opm::
movem.l d1-d2,-(sp)
opmset #%0_0_0_0_0_000,#$08 ;C2=0,M2=0,C1=0,M1=0(CH1)
opmset #%0_0_0_0_0_001,#$08 ;C2=0,M2=0,C1=0,M1=0(CH2)
opmset #%0_0_0_0_0_010,#$08 ;C2=0,M2=0,C1=0,M1=0(CH3)
opmset #%0_0_0_0_0_011,#$08 ;C2=0,M2=0,C1=0,M1=0(CH4)
tst.b mono_play_flag
bne @f
opmset #%0_0_0_0_0_100,#$08 ;C2=0,M2=0,C1=0,M1=0(CH5)
opmset #%0_0_0_0_0_101,#$08 ;C2=0,M2=0,C1=0,M1=0(CH6)
opmset #%0_0_0_0_0_110,#$08 ;C2=0,M2=0,C1=0,M1=0(CH7)
opmset #%0_0_0_0_0_111,#$08 ;C2=0,M2=0,C1=0,M1=0(CH8)
@@:
movem.l (sp)+,d1-d2
rts